#include<bits/stdc++.h>

using namespace std;
const int N=505;
int n,m,s,d;//n城市个数 m快速道路条数 s起点 d终点
int nums[505];//每个城市的救援队数量
bool st[N];//记录起点到终点是否已被确定最短路径长度
int dist[N];////记录起点到终点最短路径长度
int path[N];//记录最短路径过程中终点的直接前驱顶点序号

struct city{
    int vexs[N];
    int arcs[N][N];
    int vnums,arcnums;//顶点数和边数
};

int Dijkstra(city g ,int sta){
    for(int i=0;i<n;i++){
        dist[i]=g.arcs[sta][i];
        if(dist[i]<0x3f)
            path[i]=sta;
        else
            path[i]=-1;
    }
    st[sta]=true;
    dist[sta]=0;
    int pos;
    for(int i=1;i<n;i++){
        int min=0x3f;
        for(int j=0;j<n;j++)
            if(!st[j]&&dist[j]<min){
                pos=j;
                min=dist[j];
            }
            st[pos]=true;
            for(int k=0;k<n;k++)
                if(!st[k]&&dist[pos]+g.arcs[pos][k]<dist[k]){
                    dist[k]=dist[pos]+g.arcs[pos][k];
                    path[k]=pos;
                }
    }
}
int main(){
    city g;
    scanf("%d%d%d%d",&n,&m,&s,&d);
    for(int i=0;i<n;i++)
        scanf("%d",&nums[i]);
    memset(st,false,N);
    memset(g.arcs,0x3f,sizeof(g.arcs));    
    int a,b,c;
    for(int i=0;i<m;i++)
    {
        cin>>a>>b>>c;
        g.arcs[a][b]=g.arcs[b][a]=c;
    }
    Dijkstra(g,2);
    for(int i=0;i<n;i++){
        if(st[i])
            cout<<i<<" ";
    }
    cout<<dist[3];
    return 0;
}